package com.woniuxy.services.impl;

import com.woniuxy.config.MinioConfig;
import com.woniuxy.services.FileService;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {


    @Autowired
    private MinioClient minioClient;
    @Autowired
    private MinioConfig minioConfig; //在这里注入，方便在当前类中获取到yml中的信息
    //处理文件上传，返回值代表了文件上传成功到minio服务器之后的文件的完整的url
    @Override
    public String upload(MultipartFile multipartFile) {
        //xxx.jpg
        //UUID
        String url="";
        try {
            //获取到上传的文件的原始名称
            String fileName = multipartFile.getOriginalFilename();
            //使用uuid+原始文件名称的后缀形成了一个新的文件名称
            String newFileName = UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
            // 检查存储桶是否已经存在
            boolean isExist = minioClient.bucketExists(minioConfig.getBucketName());
            //如果不存在，根据yml总配置的文件名称在minio服务器上创建一个桶，
            if (isExist) {
                System.out.println("Bucket already exists.");
            } else {

                minioClient.makeBucket(minioConfig.getBucketName());
            }

            /*
             * 1.上传到minio服务器之前，做一些设置
             * */
            PutObjectOptions options = new PutObjectOptions(multipartFile.getInputStream().available(),-1);
            //设置图片的contentType，如果不是PNG图片就自行修改对应的contentType,这样做的目的是为了上传之后访问图片时可以在浏览器预览而不用下载，当然也可以注释这行代码
            options.setContentType(multipartFile.getContentType());
            //将multipartFile中包含的文件信息上传到minio服务器上
            minioClient.putObject(minioConfig.getBucketName(), newFileName, multipartFile.getInputStream(), options);

            //  http://localhost:9000/test0911/******.jpg
            url = minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + newFileName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return url;
    }

    @Override
    public void remove(String filename) throws Exception {
        minioClient.removeObject(minioConfig.getBucketName(), filename);
    }
}